#ifndef __MODEL_H__
#define __MODEL_H__
#include <vector>
#include <string>
#include "geometry.h"
#include "tgaimage.h"

// 模型数据结构
class Model {
private:
    // 顶点坐标集合
    std::vector<vec3> verts_;     // array of vertices
    // uv采样坐标集合
    std::vector<vec2> uv_;        // array of tex coords
    // 法线坐标集合
    std::vector<vec3> norms_;     // array of normal vectors
    // 每个三角面在上述集合中的索引
    std::vector<int> facet_vrt_; 
    std::vector<int> facet_tex_;  // indices in the above arrays per triangle
    std::vector<int> facet_nrm_;
    // 漫反射颜色纹理
    TGAImage diffusemap_;         // diffuse color texture
    // 法线贴图纹理
    TGAImage normalmap_;          // normal map texture
    // 高光贴图纹理
    TGAImage specularmap_;        // specular map texture
    // 加载
    void load_texture(const std::string filename, const std::string suffix, TGAImage &img);
public:
    Model(const std::string filename);
    // 顶点数量
    int nverts() const;
    // 三角面数量
    int nfaces() const;
    // 每个三角面的法线顶点
    vec3 normal(const int iface, const int nthvert) const;  // per triangle corner normal vertex
    // 使用uv在法线贴图纹理中采样出法线向量
    vec3 normal(const vec2 &uv) const;                      // fetch the normal vector from the normal map texture
    // 顶点坐标
    vec3 vert(const int i) const;
    // 第iface个三角面中 第 nthvert个顶点的向量
    vec3 vert(const int iface, const int nthvert) const;
    // 第iface个三角面中 第 nthvert个顶点的uv坐标
    vec2 uv(const int iface, const int nthvert) const;
    // 使用uv采样漫反射纹理的颜色
    TGAColor diffuse(const vec2 &uv) const;
    // 采样高光颜色
    double specular(const vec2 &uv) const;
};
#endif //__MODEL_H__

